// Loesung_von_Aufgabe_6.9_1_stehende_Welle

float A = 70; // Amplitude
float w = 0; // Winkel in Grad

void setup() 
{
  size(900, 300);
  frameRate(40); // Bilder pro Sekunden
}

void draw() 
{
  background(255);

  /* Rasterwert festlegen
   Der Wert zwischen den runden Klammern gibt den Abstand der 
   Gitterlinien an, der bei void gitter(int gitterabstand) 
   als Variable gitterabstand deklariert wurde */
  gitter(30);

  // Koordinatenursprung verschieben
  translate(0, 150);

  // Der Winkel wird um ein Grad pro Durchlauf erhöht
  w++; 

  // Die einzelnen Oszillatoren werden erzeugt
  noStroke();

  for (int i = 0; i < 30; i++) 
  {
    if (i*20%360 == 0) // Modulo-Operator gibt nur den Rest der Division zurück
      fill(255, 0, 0); // rote Oszillatoren
    else
      fill(0, 0, 0); // schwarze Oszillatoren

    /* Der Kreismittelpunkt wird jeweils um i*30 nach rechts verschoben
     und der Winkel wird jeweils um i*20 verringert */
    ellipse(30+i*30, A*sin(radians(w-i*20)), 10, 10);

    fill(0, 0, 255);
    ellipse(30+i*30, A*sin(radians(w+i*20)), 10, 10);

    fill(255, 0, 0);
    ellipse(30+i*30, A*sin(radians(w-i*20))+A*sin(radians(w+i*20)), 15, 15);
  }
}

// Raster, Koordiantensystem und Skala zeichnen
void gitter(int gitterabstand)
{
  // Gitternetz
  stroke(200);
  strokeWeight(1);
  for (int x = 0; x < width; x += gitterabstand) 
    line(x, 0, x, height);

  for (int y = 0; y < height; y += gitterabstand) 
    line(0, y, width, y);   

  // Koordinatensystem
  stroke(0);
  strokeWeight(3);
  line(0, 150, 900, 150);
  line(30, 0, 30, 300);

  // Skala
  stroke(0);
  line(165, 150, 165, 160);
  line(300, 150, 300, 160);
  line(435, 150, 435, 160);
  line(570, 150, 570, 160);
  line(705, 150, 705, 160);
  line(840, 150, 840, 160);
  fill(0, 0, 255);
  textSize(12);
  text("0", 18, 180);
  text("135", 155, 180);
  text("270", 290, 180);
  text("405", 425, 180);
  text("540", 560, 180);
  text("675", 695, 180);
  text("810", 830, 180);

  // Knotenpunkte
  noStroke();
  fill(0, 255, 0);
  ellipse(165, 150, 15, 15);
  ellipse(435, 150, 15, 15);
  ellipse(705, 150, 15, 15);
}